package natappvip.liujinliang.service.impl;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import natappvip.liujinliang.exception.FileIOException;
import natappvip.liujinliang.model.FileEle;
import natappvip.liujinliang.service.FileSourceService;
import natappvip.liujinliang.util.DateTimeUtil;
import natappvip.liujinliang.util.FileHandler;
import natappvip.liujinliang.util.UUIDUtil;

/**
 * @ClassName:  FileSourceServiceImpl   
 * @Despt: 文件内容接口的实现   
 * @Auth: Liujinliang 
 * @Date: 2018年7月29日 下午9:37:09
 */
public class FileSourceServiceImpl implements FileSourceService {
	private static Logger logger = LoggerFactory.getLogger(FileSourceServiceImpl.class);
	
	public static final String METADATA_FILE_PATH = "mdata.txt";	
	
	/* 
	 * 保存文件，记录文件存储元信息
	 * @see service.FileOperation#save(java.io.InputStream, int)
	 */
	@Override
	public String save(InputStream input, int size) {
		
		FileEle ele = new FileEle();
		String uuid = UUIDUtil.uuid();	// 生成文件唯一标识
		File dest = FileHandler.getFile(uuid); // 根据 uuid 创建文件
		ele.set(uuid, size, DateTimeUtil.date2str(), 1);	// 封装文件信息
		
		/* 存储文件 */
		try {
			FileHandler.save(input, new FileOutputStream(dest));	// 存储文件
			return ele.toString();
		} catch (FileNotFoundException e) {
			logger.info("mdata.txt文件不存在或者文件路径有误");
			throw new FileIOException(e.getMessage());
		}
	}
	
	/*
	 * 保存文件，记录文件存储元信息
	 * @see service.FileOperation#save(java.io.File)
	 */
	@Override
	public String save(File file) {
		
		FileEle ele = new FileEle();
		String uuid = UUIDUtil.uuid();	// 生成文件唯一标识
		File dest = FileHandler.getFile(uuid); // 根据uuid创建文件
		ele.set(uuid, file.length(), DateTimeUtil.date2str(), 1);	// 封装文件信息
		
		/* 存储文件 */
		try {
			FileHandler.save(new FileInputStream(file), new FileOutputStream(dest));
			return ele.toString();
		} catch (FileNotFoundException e) {
			logger.info("mdata.txt文件不存在或者文件路径有误");
			throw new FileIOException(e.getMessage());
		}
	}
	
	/*
	 * 保存文件，记录文件存储元信息
	 * @see service.FileOperation#save(byte[])
	 */
	@Override
	public String save(byte[] byteArray) {
		
		FileEle ele = new FileEle();
		String uuid = UUIDUtil.uuid();	// 生成文件唯一标识
		File dest = FileHandler.getFile(uuid); // 根据uuid创建文件
		ele.set(uuid, byteArray.length, DateTimeUtil.date2str(), 1);	// 封装文件信息
		
		/* 存储文件 */
		try {
			FileHandler.save(new ByteArrayInputStream(byteArray), new FileOutputStream(dest));
			return ele.toString();
		} catch (FileNotFoundException e) {
			logger.info("mdata.txt文件不存在或者文件路径有误");
			throw new FileIOException(e.getMessage());
		}
	}
	
	/*
	 * 以字节数组获取文件内容
	 * @see service.FileOperation#getResource2ByteArray(java.lang.String)
	 */
	@Override
	public byte[] getResource2ByteArray(String id) {
		
		ByteArrayOutputStream byteArrayOutputStream = getResource2OutputStream(id);
		return FileHandler.OutputStream2ByteArray(byteArrayOutputStream);
	}

	/*
	 * 以字节输出流获取文件内容
	 * @see service.FileOperation#getResource2OutputStream(java.lang.String)
	 */
	@Override
	public ByteArrayOutputStream getResource2OutputStream(String id) {
		ByteArrayOutputStream dest = null;
		
		File[] TrxFiles = FileHandler.getFilesByUUID(id);	//获取指定目录下的所有文件
		for (File curFile:TrxFiles ){	// 遍历文件
        	if (curFile.getName().equals(new String(id))) {	// 命中文件
        		dest = new ByteArrayOutputStream((int)curFile.length());
				try {
					FileHandler.save(new FileInputStream(curFile), dest); 	// 读取文件到输出流
				} catch (FileNotFoundException e) {
					logger.info("{}文件不存在或者文件路径有误", curFile.getName());
					throw new FileIOException(e.getMessage());
				}	
        	}
        }
		return dest;
	}

	/*
	 * 删除文件，删除文件存储的元信息
	 * @see service.FileOperation#delete(java.lang.String)
	 */
	@Override
	public int delete(String uuid) {
		int res = FileHandler.delFile(uuid);
		return res;
	}
}
